<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        
        <meta name="author" content="隐星魂 (Roy.Sun)">
        
        <link rel="shortcut icon" href="../../img/favicon.ico">
        <title>03.构建系统 - 玄武操作系统</title>
        <link href="../../css/bootstrap.min.css" rel="stylesheet">
        <link href="../../css/font-awesome.min.css" rel="stylesheet">
        <link href="../../css/base.css" rel="stylesheet">
        <link rel="stylesheet" href="https://cdn.staticfile.org/highlight.js/10.0.3/styles/color-brewer.min.css">

        <script src="../../js/jquery-1.10.2.min.js" defer></script>
        <script src="../../js/bootstrap.min.js" defer></script>
        <script src="https://cdn.staticfile.org/highlight.js/10.0.3/highlight.min.js"></script>
        <script>hljs.initHighlightingOnLoad();</script> 
    </head>

    <body>
        <div class="navbar fixed-top navbar-expand-lg navbar-dark bg-primary">
            <div class="container">
                <a class="navbar-brand" href="../..">玄武操作系统</a>
                <!-- Expander button -->
                <button type="button" class="navbar-toggler" data-toggle="collapse" data-target="#navbar-collapse">
                    <span class="navbar-toggler-icon"></span>
                </button>

                <!-- Expanded navigation -->
                <div id="navbar-collapse" class="navbar-collapse collapse">
                        <!-- Main navigation -->
                        <ul class="nav navbar-nav">
                            <li class="navitem">
                                <a href="../.." class="nav-link">主页</a>
                            </li>
                            <li class="navitem">
                                <a href="../../license/" class="nav-link">开源协议</a>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">快速开发指南 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">STM32</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../QuickGuide/stm32/01-Envsetup-Guide/" class="dropdown-item">开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/02-Project-Setup-Guide/" class="dropdown-item">工程配置指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/03-atkh743/" class="dropdown-item">正点原子阿波罗H743开发板上手指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/04-fk429m/" class="dropdown-item">反客F429核心板上手指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/05-atkf407core/" class="dropdown-item">正点原子F407核心板上手指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/stm32/06-atkf103core/" class="dropdown-item">正点原子F103核心板上手指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">NXP S32K</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../QuickGuide/s32k/01-Envsetup-Guide/" class="dropdown-item">开发环境搭建指南</a>
</li>
            
<li>
    <a href="../../QuickGuide/s32k/02-Project-Setup-Guide/" class="dropdown-item">工程配置指南</a>
</li>
    </ul>
  </li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">玄武内核模块</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../QuickGuide/xwko/01-XuanWuKO-Guide/" class="dropdown-item">上手指南</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown active">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">应用手册 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../00-index/" class="dropdown-item">00.目录</a>
</li>
                                    
<li>
    <a href="../01-brief/" class="dropdown-item">01.简介</a>
</li>
                                    
<li>
    <a href="../02-Basic-System-Architecture/" class="dropdown-item">02.系统基本架构</a>
</li>
                                    
<li>
    <a href="./" class="dropdown-item active">03.构建系统</a>
</li>
                                    
<li>
    <a href="../04-Boot-Flow/" class="dropdown-item">04.启动流程</a>
</li>
                                    
<li>
    <a href="../05-IRQ/" class="dropdown-item">05.中断控制</a>
</li>
                                    
<li>
    <a href="../06-SKD/" class="dropdown-item">06.调度器</a>
</li>
                                    
<li>
    <a href="../07-Thread/" class="dropdown-item">07.线程</a>
</li>
                                    
<li>
    <a href="../08-SWT/" class="dropdown-item">08.软件定时器</a>
</li>
                                    
<li>
    <a href="../09-PM/" class="dropdown-item">09.电源管理</a>
</li>
                                    
<li>
    <a href="../10-Lock/" class="dropdown-item">10.锁</a>
</li>
                                    
<li>
    <a href="../11-Sync/" class="dropdown-item">11.同步</a>
</li>
                                    
<li>
    <a href="../12-MM/" class="dropdown-item">12.内存管理</a>
</li>
                                    
<li>
    <a href="../13-C-Lib/" class="dropdown-item">13.玄武C库</a>
</li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">移植笔记 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../PortingNote/00-index/" class="dropdown-item">目录</a>
</li>
                                    
<li>
    <a href="../../PortingNote/01-Porting-Note/" class="dropdown-item">移植笔记</a>
</li>
                                    
  <li class="dropdown-submenu">
    <a href="#" class="dropdown-item">ARM-Cortex-M</a>
    <ul class="dropdown-menu">
            
<li>
    <a href="../../PortingNote/ARM-Cortex-M/01-ARM-Cortex-M-Porting-Note/" class="dropdown-item">架构移植笔记</a>
</li>
            
<li>
    <a href="../../PortingNote/ARM-Cortex-M/02-STM32-Porting-Note/" class="dropdown-item">STM32</a>
</li>
    </ul>
  </li>
                                </ul>
                            </li>
                            <li class="dropdown">
                                <a href="#" class="nav-link dropdown-toggle" data-toggle="dropdown">规范 <b class="caret"></b></a>
                                <ul class="dropdown-menu">
                                    
<li>
    <a href="../../Specification/00-index/" class="dropdown-item">目录</a>
</li>
                                    
<li>
    <a href="../../Specification/01-Git-Commit-Specification/" class="dropdown-item">git-commit规范</a>
</li>
                                    
<li>
    <a href="../../Specification/02-Version-Branch-Specification/" class="dropdown-item">版本分支规范</a>
</li>
                                </ul>
                            </li>
                        </ul>

                    <ul class="nav navbar-nav ml-auto">
                        <li class="nav-item">
                            <a href="#" class="nav-link" data-toggle="modal" data-target="#mkdocs_search_modal">
                                <i class="fa fa-search"></i> 搜索
                            </a>
                        </li>
                            <li class="nav-item">
                                <a rel="prev" href="../02-Basic-System-Architecture/" class="nav-link">
                                    <i class="fa fa-arrow-left"></i> 上一篇
                                </a>
                            </li>
                            <li class="nav-item">
                                <a rel="next" href="../04-Boot-Flow/" class="nav-link">
                                    下一篇 <i class="fa fa-arrow-right"></i>
                                </a>
                            </li>
                    </ul>
                </div>
            </div>
        </div>

        <div class="container">
            <div class="row">
                    <div class="col-md-3"><div class="navbar-light navbar-expand-md bs-sidebar hidden-print affix" role="complementary">
    <div class="navbar-header">
        <button type="button" class="navbar-toggler collapsed" data-toggle="collapse" data-target="#toc-collapse" title="Table of Contents">
            <span class="fa fa-angle-down"></span>
        </button>
    </div>

    
    <div id="toc-collapse" class="navbar-collapse collapse card bg-secondary">
        <ul class="nav flex-column">
            
            <li class="nav-item" data-level="1"><a href="#3" class="nav-link">3.构建系统</a>
              <ul class="nav flex-column">
            <li class="nav-item" data-level="2"><a href="#31" class="nav-link">3.1.构建流程</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#32" class="nav-link">3.2.编译选项</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#33" class="nav-link">3.3.玄武模块</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#34" class="nav-link">3.4.辅助功能</a>
              <ul class="nav flex-column">
              </ul>
            </li>
            <li class="nav-item" data-level="2"><a href="#35" class="nav-link">3.5.附录</a>
              <ul class="nav flex-column">
              </ul>
            </li>
              </ul>
            </li>
        </ul>
    </div>
</div></div>
                    <div class="col-md-9" role="main">

<h1 id="3">3.构建系统</h1>
<p>玄武OS提供了一个编译集成环境，可在Windows、Linux、MacOS上运行，目前支持：</p>
<ul>
<li>基于ARMv6/v7-m的单片机，gcc编译器</li>
<li>PowerPC E200Zx的单片机，gcc编译器</li>
</ul>
<h2 id="31">3.1.构建流程</h2>
<ul>
<li>玄武OS的构建系统在构建<strong>内核</strong>、<strong>xwmd</strong>模块、<strong>xwcd</strong>模块、<strong>xwem</strong>模块、
    <strong>xwam</strong>模块、<strong>oem</strong>模块时都是独立编译成静态库<strong>.a</strong>，然后再链接。
    各个模块的编译配置（头文件、编译器选项）都是完全独立的，可以理解为不同的子工程。</li>
<li>玄武OS的构建是从<code>xwbd/电路板名称/</code>录下执行命令<code>make</code>开始的。
    以<code>$XWOS_BRD_DIR</code>代表此目录。生成的文件全部位于<code>$WKSPC</code>，<code>$WKSPC</code>的
    默认路径为<code>$XWOS_BRD_DIR/wkspc</code>，可在在编译之前将<code>WKSPC</code> <code>export</code>到环境变量中。</li>
</ul>
<p><img alt="img" src="../res/figure/build-flow.png" title="玄武OS构建流程" /></p>
<h3 id="_1">生成配置</h3>
<ul>
<li>构建系统会调用脚本<code>xwbs/util/el/mkcfg.el</code>处理<code>$XWOS_BRD_DIR/cfg</code>下的
    所有配置文件，将它们转化成三个文件：<ul>
<li><code>$WKSPC/XuanWuOS.cfg</code>，这个配置文件之后会被构建系统引入。</li>
<li><code>$XWOS_BRD_DIR/wkspc/autogen.h</code>，此文件会被自动包含在顶级头文件<code>xwos/standard.h</code>中。</li>
<li><code>$XWOS_BRD_DIR/wkspc/env.rc</code>，在<code>bash</code>中<code>source</code>这个文件，
可在终端环境中引入一些<a href="#BS-ASSIST">辅助功能</a>。</li>
</ul>
</li>
</ul>
<h3 id="adl">编译ADL</h3>
<p>编译系统会根据编译规则<code>$XWOS_ARCH_DIR/arch.mk</code>，
编译架构描述层(Arch Description Layer)的源码，
并输出静态库<strong>arch.a</strong>到<code>$WKSPC/obj</code>目录下。</p>
<h3 id="cdl">编译CDL</h3>
<p>编译系统会根据编译规则<code>$XWOS_CPU_DIR/arch.mk</code>，
编译架构描述层(CPU Description Layer)的源码，
并输出静态库<strong>cpu.a</strong>到<code>$WKSPC/obj</code>目录下。</p>
<h3 id="sdl">编译SDL</h3>
<p>编译系统会根据编译规则<code>$XWOS_SOC_DIR/soc.mk</code>，
编译架构描述层(SOC Description Layer)的源码，
并输出静态库<strong>soc.a</strong>到<code>$WKSPC/obj</code>目录下。</p>
<h3 id="bdl">编译BDL</h3>
<p>编译系统会根据编译规则<code>$XWOS_BDL_DIR/bdl.mk</code>，
编译架构描述层(Arch Description Layer)的源码，
并输出静态库<strong>bdl.a</strong>到<code>$WKSPC/obj</code>目录下。</p>
<h3 id="xwos">编译XWOS内核</h3>
<p>编译系统会加载位于<code>xwos/xwos.mk</code>的编译规则，最后输出静态库
<strong>xwos.a</strong>到<code>$WKSPC/obj</code>目录下。</p>
<h3 id="_2">编译中间件</h3>
<ul>
<li>编译系统会扫描<code>xwmd/</code>文件夹下的<code>xwmo.mk</code>文件，生成模块列表，
    依次将它们编译成<strong>.a</strong>静态库，输出到<code>$WKSPC/obj</code>目录下。</li>
<li>每个<code>xwmo.mk</code>文件代表了一个模块，其中定义了模块相关的参数：源代码列表、
    附加编译选项、头文件路径等。</li>
<li>每个中间件模块在<code>$XWOS_BRD_DIR/cfg/xwmd.h</code>中都有一个编译开关的宏定义，
    编译开关定义为<code>1</code>时表示包含这个模块，<code>0</code>或<strong>未定义</strong>表示排除这个模块。</li>
<li>编译开关的命名规则参考<a href="#BS-NAMERULE">模块编译开关的命名规则</a>。</li>
</ul>
<h3 id="_3">编译设备库</h3>
<ul>
<li>编译系统会扫描<code>xwcd</code>文件夹下的<code>xwmo.mk</code>文件，生成模块列表，
    依次将它们编译成<strong>.a</strong>静态库，输出到<code>$WKSPC/obj</code>目录下。</li>
<li>每个<code>xwmo.mk</code>文件代表了一个模块，其中定义了模块相关的参数：源代码列表、
    附加编译选项、头文件路径等。</li>
<li>每个外设库模块在<code>$XWOS_BRD_DIR/cfg/xwcd.h</code>中都有一个编译开关的宏定义，
    编译开关定义为<code>1</code>时表示包含这个模块，<code>0</code>或<strong>未定义</strong>表示排除这个模块。</li>
<li>编译开关的命名规则参考<a href="#BS-NAMERULE">模块编译开关的命名规则</a>。</li>
</ul>
<h3 id="_4">编译电路板模块</h3>
<ul>
<li>编译系统会扫描<code>$XWOS_BM_DIR</code>文件夹下的<code>xwmo.mk</code>文件，生成模块列表，
    依次将它们编译成<strong>.a</strong>静态库，输出到<code>$WKSPC/obj</code>目录下。</li>
<li>每个<code>xwmo.mk</code>文件代表了一个模块，其中定义了模块相关的参数：源代码列表、
    附加编译选项、头文件路径等。</li>
<li>每个电路板模块在<code>$XWOS_BRD_DIR/cfg/board.h</code>中都有一个编译开关的宏定义，
    编译开关定义为<code>1</code>时表示包含这个模块，<code>0</code>或<strong>未定义</strong>表示排除这个模块。</li>
<li>编译开关的命名规则参考<a href="#BS-NAMERULE">模块编译开关的命名规则</a>。</li>
</ul>
<h3 id="_5">编译第三方软件模块</h3>
<ul>
<li>编译系统会扫描<code>xwem</code>文件夹下的<code>xwmo.mk</code>文件，生成模块列表，
    依次将它们编译成<strong>.a</strong>静态库，输出到<code>$WKSPC/obj</code>目录下。</li>
<li>每个<code>xwmo.mk</code>文件代表了一个模块，其中定义了模块相关的参数：源代码列表、
    附加编译选项、头文件路径等。</li>
<li>每个外设库模块在<code>$XWOS_BRD_DIR/cfg/xwem.h</code>中都有一个编译开关的宏定义，
    编译开关定义为<code>1</code>时表示包含这个模块，<code>0</code>或<strong>未定义</strong>表示排除这个模块。</li>
<li>编译开关的命名规则参考<a href="#BS-NAMERULE">模块编译开关的命名规则</a>。</li>
</ul>
<h3 id="_6">编译应用模块</h3>
<ul>
<li>编译系统会扫描<code>xwam</code>文件夹下的<code>xwmo.mk</code>文件，生成模块列表，
    依次将它们编译成<strong>.a</strong>静态库，输出到<code>$WKSPC/obj</code>目录下。</li>
<li>每个<code>xwmo.mk</code>文件代表了一个模块，其中定义了模块相关的参数：源代码列表、
    附加编译选项、头文件路径等。</li>
<li>每个外设库模块在<code>$XWOS_BRD_DIR/cfg/xwam.h</code>中都有一个编译开关的宏定义，
    编译开关定义为<code>1</code>时表示包含这个模块，<code>0</code>或<strong>未定义</strong>表示排除这个模块。</li>
<li>编译开关的命名规则参考<a href="#BS-NAMERULE">模块编译开关的命名规则</a>。</li>
</ul>
<h3 id="oem">编译OEM模块</h3>
<ul>
<li>OEM模块文件夹路径由配置<code>XuanWuOS_CFG_OEMPATH</code>指定，此配置位于<code>cfg/XuanWuOS.h</code>中：<ul>
<li>如果配置为相对路径，则为相对于玄武OS根目录的路径；</li>
<li>可以配置为绝对路径；</li>
<li>路径可以在玄武OS根目录之外。</li>
</ul>
</li>
<li>编译系统会扫描OEM模块文件夹下的<code>xwmo.mk</code>文件，生成模块列表，
    依次将它们编译成<strong>.a</strong>静态库，输出到<code>$WKSPC/obj/oem</code>目录下。</li>
<li>每个<code>xwmo.mk</code>文件代表了一个模块，其中定义了模块相关的参数：源代码列表、
    附加编译选项、头文件路径等。</li>
<li>每个外设库模块在<code>$XWOS_BRD_DIR/cfg/oem.h</code>中都有一个编译开关的宏定义，
    编译开关定义为<code>1</code>时表示包含这个模块，<code>0</code>或<strong>未定义</strong>表示排除这个模块。</li>
<li>编译开关的命名规则参考<a href="#BS-NAMERULE">模块编译开关的命名规则</a>。</li>
</ul>
<h3 id="elf">连接ELF文件</h3>
<p>编译系统最终会将以上生成的所有<strong>.a</strong>静态库连接成<strong>XuanWuOS.elf</strong>文件，
连接脚本由<code>$XWOS_BRD_DIR/$XuanWuOS_CFG_LDSCRIPT</code>定义。</p>
<h3 id="_7">生成其他文件</h3>
<p>编译系统会将<strong>XuanWuOS.elf</strong>文件转换成<strong>.bin</strong>文件以及<strong>.hex</strong>文件，
也会生成调试脚本等其他文件。</p>
<h2 id="32">3.2.编译选项</h2>
<ul>
<li><code>~V</code><ul>
<li>取值：<ul>
<li>1: 开启选项</li>
<li>0: 关闭选项（默认值）</li>
</ul>
</li>
<li>用法：</li>
</ul>
</li>
</ul>
<pre><code class="sh">make ~V=1
</code></pre>

<ul>
<li>
<p>作用：输出完整的编译过程</p>
</li>
<li>
<p><code>~D</code></p>
<ul>
<li>取值：<ul>
<li>1: 开启选项（默认值）</li>
<li>0: 关闭选项</li>
</ul>
</li>
<li>用法：</li>
</ul>
</li>
</ul>
<pre><code class="sh">make ~D=0
</code></pre>

<ul>
<li>作用：优化编译，输出体积较小的二进制，但不利于调试。</li>
</ul>
<h2 id="33">3.3.玄武模块</h2>
<p><a id="BS-XWMO"></a></p>
<p>玄武OS的外设驱动模块、电路板模块、中间件模块、第三方软件模块以及OEM模块，
都是使用<code>xwmo.mk</code>来描述编译规则的，将它们统一称为<strong>玄武模块</strong>。
编译规则<code>xwmo.mk</code>的设计原理类似于Android系统中的<code>Android.mk</code>。每个<strong>玄武模块</strong>都是
独立编译的，其中定义的编译参数、头文件只对自己有效。</p>
<p>示例，<code>xwam/example/cxx</code>的<code>xwmo.mk</code>：</p>
<pre><code class="makefile">include $(XWOS_WKSPC_DIR)/XuanWuOS.cfg                 # 包含默认配置
include $(XWBS_UTIL_MK_XWMO)                           # 包含一些Makefile函数

XWMO_CSRCS := mif.c                                    # 指定C源文件
XWMO_CFLAGS :=                                         # 指定附加的C编译规则

XWMO_CXXSRCS := task.cxx                               # 指定C++源文件
XWMO_CXXSRCS += test/literal.cxx test/vector.cxx       # 增加C++源文件
XWMO_CXXFLAGS := -Wno-unused-value -Wno-literal-suffix # 去掉一些编译警告

XWMO_INCDIRS := $(call getXwmoDir)                     # 指定附加的头文件搜索路径
include xwbs/$(XuanWuOS_CFG_XWMO_MK)                   # 引用编译Makefile执行编译
</code></pre>

<h3 id="_8">模块路径命名规则</h3>
<ul>
<li>由于模块路径需要对应于C语言中的一个宏定义作为编译开关，
    因此模块路径需要符合C语言标识符的规则，但可以包含几个特殊符号：<ul>
<li>路径不能以数字开头；</li>
<li>路径中每级目录以<code>/</code>隔开；</li>
<li>路径中可包含<code>.</code>，但不能出现<code>../</code>和<code>./</code>；</li>
<li>路径中可包含<code>-</code>；</li>
</ul>
</li>
</ul>
<h3 id="_9">模块编译开关的命名规则</h3>
<p><a id="BS-NAMERULE"></a></p>
<ul>
<li>模块路径只需要转换相对路径部分：<ul>
<li>中间件模块：取<strong>xwmd</strong>（不含）之后的路径；</li>
<li>设备驱动模块：取<strong>xwcd</strong>（不含）之后的路径；</li>
<li>电路板模块：取<strong>$XWOS_BM_DIR</strong>（不含）之后的路径；</li>
<li>第三方软件模块：取<strong>xwem</strong>（不含）之后的路径；</li>
<li>应用模块：取<strong>xwam</strong>（不含）之后的路径；</li>
<li>OEM模块：取<strong>oem目录</strong>（不含）之后的路径。</li>
</ul>
</li>
<li>路径中的<code>_</code>，需要两个<code>_</code>来表示；</li>
<li>路径中的<code>/</code>被转换成<code>_</code>；</li>
<li>路径中的<code>.</code>被转换成<code>_</code>；</li>
<li>路径中的<code>-</code>被转换成<code>_</code>；</li>
<li>增加前缀：<ul>
<li>中间件模块：<code>XWMDCFG</code></li>
<li>设备模块：<code>XWCDCFG</code></li>
<li>电路板模块：<code>BMCFG</code></li>
<li>第三方软件模块：<code>XWEMCFG</code></li>
<li>应用模块：<code>XWAMCFG</code></li>
<li>OEM模块：<code>OEMCFG</code></li>
</ul>
</li>
<li>示例：<ul>
<li>中间件模块：<code>xwmd/isc/xwpcp</code> &#x2013;&gt; <code>XWMDCFG_isc_xwpcp</code>；</li>
<li>设备驱动模块：<code>xwcd/perpheral/ds/i2c/eeprom</code> &#x2013;&gt; *<code>XWCDCFG_perpheral_ds_i2c_eeprom</code>；</li>
<li>电路板模块：<code>xwbd/fk429m/bm/stm32_cube</code> &#x2013;&gt; <code>BMCFG_stm32__cube</code>；</li>
<li>第三方软件模块：<code>xwem/vm/l__u_a-5.4.2</code> &#x2013;&gt; <code>XWEMCFG_vm_l____u__a_5_4_2</code>；</li>
<li>应用模块：<code>xwam/example/cxx</code> &#x2013;&gt; <code>XWAMCFG_example_cxx</code>；</li>
<li>OEM模块：<code>oem/s32ksdk</code> &#x2013;&gt; <code>OEMCFG\_s32ksdk</code>；</li>
</ul>
</li>
<li>可以借助<a href="#BS-ASSIST">辅助功能</a>中的<code>xwmc</code>命令生成编译开关的宏标识符。</li>
</ul>
<h3 id="_10">增加模块</h3>
<ol>
<li>中间件模块<ul>
<li>模块位于<code>xwmd/</code>目录中；</li>
<li>编译开关以<code>XWMDCFG</code>为前缀，位于文件<code>$XWOS_BRD_DIR/cfg/xwmd.h</code>，
    定义为<code>1</code>表示编译模块。</li>
</ul>
</li>
<li>设备驱动模块<ul>
<li>模块位于<code>xwcd/</code>目录中；</li>
<li>编译开关以 <code>XWCDCFG</code>为前缀，位于文件<code>$XWOS_BRD_DIR/cfg/xwcd.h</code>，
    定义为<code>1</code>表示编译模块。</li>
</ul>
</li>
<li>电路板模块<ul>
<li>模块位于<code>$XWOS_BRD_DIR/bm/</code>目录中；</li>
<li>编译开关以<code>BMCFG</code>为前缀，位于文件<code>$XWOS_BRD_DIR/cfg/board.h</code>，
    定义为<code>1</code>表示编译模块。</li>
</ul>
</li>
<li>第三方软件模块<ul>
<li>模块位于<code>xwem/</code>目录中；</li>
<li>编译开关以<code>XWEMCFG</code>为前缀，位于文件<code>$XWOS_BRD_DIR/cfg/xwem.h</code>，
    定义为<code>1</code>表示编译模块。</li>
</ul>
</li>
<li>应用模块<ul>
<li>模块位于<code>xwam/</code>目录中；</li>
<li>编译开关以<code>XWAMCFG</code>为前缀，位于文件<code>$XWOS_BRD_DIR/cfg/xwam.h</code>，
    定义为<code>1</code>表示编译模块。</li>
</ul>
</li>
<li>OEM模块<ul>
<li>模块位于配置<code>XuanWuOS_CFG_OEMPATH</code>指定的目录中；</li>
<li>编译开关以<code>OEMCFG</code>为前缀，位于文件<code>$XWOS_BRD_DIR/cfg/oem.h</code>，
    定义为<code>1</code>表示编译模块。</li>
</ul>
</li>
<li><code>xwmo.mk</code>模板</li>
</ol>
<pre><code class="makefile">include $(XWOS_WKSPC_DIR)/XuanWuOS.cfg # 包含配置文件
include $(XWBS_UTIL_MK_XWMO) # 包含一些Makefile函数，例如下面调用的getXwmoDir
XWMO_CSRCS :=             # C源文件
XWMO_CFLAGS :=            # 增加C编译选项
XWMO_CXXSRCS :=           # C++源文件
XWMO_CXXFLAGS :=          # 增加C++编译选项
XWMO_INCDIRS := $(call getXwmoDir)    # 获取模块路径并附加到头文件搜索路径
XWMO_LUASRCS :=           # 增加Lua源文件
include xwbs/$(XuanWuOS_CFG_XWMO_MK)  # 引用编译Makefile执行编译
</code></pre>

<h2 id="34">3.4.辅助功能</h2>
<p><a id="BS-ASSIST"></a></p>
<p>为了方便开发，玄武OS定义了一些与模块编译相关的辅助命令。</p>
<h3 id="_11">初始化环境</h3>
<pre><code class="sh">source xwbd/fk429m/env.sh # 假设电路板名称是fk429m
</code></pre>

<h3 id="_12">命令</h3>
<ul>
<li><code>xwmc</code><ul>
<li>功能：获取模块编译开关的C语言宏标识符。</li>
<li>用法举例：</li>
</ul>
</li>
</ul>
<pre><code class="sh">cd ${XWOS_PATH}/xwem/vm/lua # 进入到vm/lua模块中
xwmc
&gt; XWEMCFG_vm_lua # 输出结果
</code></pre>

<ul>
<li><code>xwmn</code><ul>
<li>功能：获取模块的<strong>.a</strong>文件名。</li>
<li>用法举例：</li>
</ul>
</li>
</ul>
<pre><code class="sh">cd ${XWOS_PATH}/xwem/vm/lua # 进入到vm/lua模块中
xwmn
&gt; xwem_vm_lua.a # 输出
</code></pre>

<ul>
<li><code>xwm</code><ul>
<li>功能：编译整个玄武OS工程，类似Android的m命令。</li>
<li>用法：<code>xwm [选项] [目标]</code></li>
<li>选项 -B：全部重新编译一次</li>
<li>目标：make的目标</li>
<li>用法举例：</li>
</ul>
</li>
</ul>
<pre><code class="sh">xwm # 编译整个工程
xwm c # 清理
xwm d # 侧底清理
</code></pre>

<ul>
<li><code>xwmm</code><ul>
<li>功能：单独编译模块，类似Android的mm命令，使用当前路径作为模块的路径。</li>
<li>选项 -B：全部重新编译一次</li>
<li>用法举例：</li>
</ul>
</li>
</ul>
<pre><code class="sh">cd ${XWOS_PATH}/xwem/vm/lua # 进入到vm/lua模块中
xwmm
</code></pre>

<ul>
<li><code>xwmmm</code><ul>
<li>功能：单独编译模块，类似Android的mmm命令，需要指定模块的路径。</li>
<li>选项 -B：全部重新编译一次</li>
<li>用法举例：</li>
</ul>
</li>
</ul>
<pre><code class="sh">xwmmm xwem/vm/lua
</code></pre>

<ul>
<li>
<p><code>xwcroot</code></p>
<ul>
<li>功能：切换到玄武OS的根目录，类似Android的croot命令。</li>
</ul>
</li>
<li>
<p><code>xwcbd</code></p>
<ul>
<li>功能：切换到电路板目录。</li>
</ul>
</li>
</ul>
<h2 id="35">3.5.附录</h2>
<ul>
<li><a href="../00-index/">返回目录</a></li>
</ul></div>
            </div>
        </div>

        <footer class="col-md-12">
            <hr>
            <p>Documentation built with <a href="https://www.mkdocs.org/">MkDocs</a>.</p>
        </footer>
        <script>
            var base_url = "../..",
                shortcuts = {"help": 191, "next": 78, "previous": 80, "search": 83};
        </script>
        <script src="../../js/base.js" defer></script>
        <script src="../../search/main.js" defer></script>

        <div class="modal" id="mkdocs_search_modal" tabindex="-1" role="dialog" aria-labelledby="searchModalLabel" aria-hidden="true">
    <div class="modal-dialog modal-lg">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="searchModalLabel">搜索</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
                <p>
                    在这里所有文档：
                </p>
                <form>
                    <div class="form-group">
                        <input type="search" class="form-control" placeholder="搜索..." id="mkdocs-search-query" title="Type search term here">
                    </div>
                </form>
                <div id="mkdocs-search-results"></div>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div><div class="modal" id="mkdocs_keyboard_modal" tabindex="-1" role="dialog" aria-labelledby="keyboardModalLabel" aria-hidden="true">
    <div class="modal-dialog">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="keyboardModalLabel">Keyboard Shortcuts</h4>
                <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
            </div>
            <div class="modal-body">
              <table class="table">
                <thead>
                  <tr>
                    <th style="width: 20%;">Keys</th>
                    <th>Action</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td class="help shortcut"><kbd>?</kbd></td>
                    <td>Open this help</td>
                  </tr>
                  <tr>
                    <td class="next shortcut"><kbd>n</kbd></td>
                    <td>Next page</td>
                  </tr>
                  <tr>
                    <td class="prev shortcut"><kbd>p</kbd></td>
                    <td>Previous page</td>
                  </tr>
                  <tr>
                    <td class="search shortcut"><kbd>s</kbd></td>
                    <td>Search</td>
                  </tr>
                </tbody>
              </table>
            </div>
            <div class="modal-footer">
            </div>
        </div>
    </div>
</div>

    </body>
</html>
